import TreeVo from './TreeVo';

/*
 * @Author: jingfuu@163.com
 * @Date: 2024-11-16 21:54:33
 * @LastEditTime: 2024-11-25 13:13:02
 * @Description: 构建tree vo
 */
export class TreeUtil {
  static buildTree<T extends TreeVo>(vos: T[]): TreeVo[] {
    // 创建一个映射，以 pid 为键，菜单项为值
    const voMap = new Map<number, TreeVo>();
    vos.forEach((vo) => voMap.set(vo.id, vo));

    // 创建一个数组来存储根菜单项
    const tree: TreeVo[] = [];

    // 遍历菜单列表，构建树形结构
    vos.forEach((vo) => {
      if (vo.pid === 0) {
        // 如果 pid 为 0，则为根菜单项，添加到树中
        tree.push(vo);
      } else {
        // 如果 pid 不为 0，则找到父菜单项，并将当前菜单项添加到其 children 数组中
        const parent = voMap.get(vo.pid);
        if (parent && !parent.children) {
          parent.children = [];
        }
        if (parent) {
          parent.children?.push(vo);
        }
      }
    });

    function sortTree(vos: TreeVo[]): void {
      vos.forEach((vo) => {
        if (vo.children) {
          vo.children.sort((a, b) => a.sort - b.sort); // 升序排序
          sortTree(vo.children); // 递归排序子树
        }
      });
    }
    // 对树进行排序
    sortTree(tree);
    return tree;
  }
}
export default TreeUtil;
